package org.example.backend.controller;

import cn.hutool.crypto.digest.BCrypt;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.example.backend.common.PageResult;
import org.example.backend.common.Result;
import org.example.backend.dto.PageRequestDTO;
import org.example.backend.entity.Admin;
import org.example.backend.entity.User;
import org.example.backend.service.AdminService;
import org.example.backend.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

/**
 * 管理员控制器
 */
@RestController
@RequestMapping("/admin")
@Api(tags = "管理员接口")
public class AdminController {

    @Autowired
    private AdminService adminService;
    
    @Autowired
    private UserService userService;

    /**
     * 分页查询管理员
     *
     * @param pageRequest 分页参数
     * @param role        角色
     * @return 分页结果
     */
    @PostMapping("/page")
    @ApiOperation("分页查询管理员")
    public Result<PageResult<Admin>> page(@Valid @RequestBody PageRequestDTO pageRequest, @RequestParam(required = false) String role) {
        Page<Admin> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize());
        page = adminService.pageAdmin(page, pageRequest.getKeyword(), role);
        return Result.success(PageResult.build(page.getTotal(), page.getSize(), page.getCurrent(), page.getRecords()));
    }

    /**
     * 获取管理员信息
     *
     * @param id 管理员ID
     * @return 管理员信息
     */
    @GetMapping("/{id}")
    @ApiOperation("获取管理员信息")
    public Result<Admin> getById(@PathVariable Long id) {
        return Result.success(adminService.getById(id));
    }

    /**
     * 添加管理员
     *
     * @param admin 管理员信息
     * @return 添加结果
     */
    @PostMapping
    @ApiOperation("添加管理员")
    public Result<?> add(@Valid @RequestBody Admin admin) {
        // 验证用户名是否已存在
        if (adminService.getByUsername(admin.getUsername()) != null) {
            return Result.error("用户名已存在");
        }
        // 加密密码
        admin.setPassword(BCrypt.hashpw(admin.getPassword()));
        adminService.save(admin);
        return Result.success();
    }

    /**
     * 更新管理员信息
     *
     * @param admin 管理员信息
     * @return 更新结果
     */
    @PutMapping
    @ApiOperation("更新管理员信息")
    public Result<?> update(@Valid @RequestBody Admin admin) {
        // 不允许修改密码
        admin.setPassword(null);
        adminService.updateById(admin);
        return Result.success();
    }

    /**
     * 删除管理员
     *
     * @param id 管理员ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    @ApiOperation("删除管理员")
    public Result<?> delete(@PathVariable Long id, HttpServletRequest request) {
        // 不允许删除自己
        Long userId = (Long) request.getAttribute("userId");
        if (id.equals(userId)) {
            return Result.error("不能删除自己");
        }
        adminService.removeById(id);
        return Result.success();
    }

    /**
     * 启用管理员
     *
     * @param id 管理员ID
     * @return 启用结果
     */
    @PutMapping("/enable/{id}")
    @ApiOperation("启用管理员")
    public Result<?> enable(@PathVariable Long id) {
        Admin admin = new Admin();
        admin.setId(id);
        admin.setStatus(1);
        adminService.updateById(admin);
        return Result.success();
    }

    /**
     * 禁用管理员
     *
     * @param id 管理员ID
     * @return 禁用结果
     */
    @PutMapping("/disable/{id}")
    @ApiOperation("禁用管理员")
    public Result<?> disable(@PathVariable Long id, HttpServletRequest request) {
        // 不允许禁用自己
        Long userId = (Long) request.getAttribute("userId");
        if (id.equals(userId)) {
            return Result.error("不能禁用自己");
        }
        Admin admin = new Admin();
        admin.setId(id);
        admin.setStatus(0);
        adminService.updateById(admin);
        return Result.success();
    }

    /**
     * 重置密码
     *
     * @param id 管理员ID
     * @return 重置结果
     */
    @PutMapping("/resetPassword/{id}")
    @ApiOperation("重置密码")
    public Result<?> resetPassword(@PathVariable Long id) {
        Admin admin = new Admin();
        admin.setId(id);
        // 默认密码为123456
        admin.setPassword(BCrypt.hashpw("123456"));
        adminService.updateById(admin);
        return Result.success();
    }

    /**
     * 管理员添加用户
     *
     * @param user 用户信息
     * @return 添加结果
     */
    @PostMapping("/user")
    @ApiOperation("管理员添加用户")
    public Result<?> addUser(@Valid @RequestBody User user) {
        // 验证用户名是否已存在
        if (userService.getByUsername(user.getUsername()) != null) {
            return Result.error("用户名已存在");
        }
        // 加密密码
        user.setPassword(BCrypt.hashpw(user.getPassword()));
        userService.save(user);
        return Result.success();
    }
} 